import path from "path";
import fs from "fs";
import express from 'express';
import dotenv from 'dotenv';
import cors from 'cors';

dotenv.config({
  path: [
    path.resolve(process.cwd(), `.env.${process.env.NODE_ENV}`), 
    path.resolve(process.cwd(), '.env'),
  ]
});

// 数据库初始化，创建连接池
import { createPool } from './util/db.js'
createPool();

// 应用启动时初始化数据库表和用户数据（可选）
// import * as users from './controllers/users.js';
// try {
//   await users.createAdminUsersTable();
//   await users.initAdminUser();
//   console.log('数据库初始化完成');
// } catch (error) {
//   console.warn('数据库初始化跳过（可能已存在）:', error.message);
// }

const app = express();
// 设置静态资源目录，用于存放可以直接访问的资源，包括上传的图片
app.use( express.static("public/") );

app.use(cors());
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

// 1.在routes中创建需要的文件夹 eg.admin、index (自己定义，index是前台前缀，admin是后台前缀，就顺便把前缀当作文件定义便于管理)
// 2.导入模块
// 3.注册路由(根据API文档)，挂载路由
// 前台接口
import indexRoutes from './routes/index/index.js';
console.log('注册前台路由: /api/v1/index');
app.use('/api/v1/index', indexRoutes);

// 后台接口
import adminRoutes from './routes/admin/index.js';
console.log('注册后台路由: /api/v1/admin');
app.use('/api/v1/admin', adminRoutes);

// 普通中间件，404兜底中间件
app.use(function(req,res,next){
  // 使用res.send()传递一个对象时，Express会自动将其转换为 JSON 格式
  // res.type("json");
  res.send({
    code:404,
    msg:`${req.path} 地址不存在`
  })
});

import { MulterError } from "multer"
// 错误处理中间件，错误捕捉
app.use(function(err,req,res,next){
  if(err instanceof MulterError){
    res.send({
      code:400,
      msg:"文件上传错误:"+err.message
    })
    return;
  }

  // 开发环境,直接在控制台打印错误信息，方便调试
  if(process.env.NODE_ENV=="development"){
    console.log('=== 服务器错误 ===');
    console.log('错误信息:', err.message);
    console.log('错误堆栈:', err.stack);
    console.log('===============');
  }
  // 生产环境：将错误信息写入日志文件，保护敏感信息不暴露给用户
  else {
    let logPath = path.resolve(process.cwd(),`./logs/${new Date().getTime()}.log`);
     // err.stack提供完整的错误调用栈信息
    let info = new Date().toLocaleString() + "\n" + decodeURI(err.stack);
    fs.writeFileSync(logPath, info);
  }
  res.send({
    code:500,
    msg:"服务器运行错误，请联系管理员"
  }); 
});

const PORT = process.env.PORT ?? 8000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

export default app;
